"""
@name : 7.类实现装饰器
@author : wenyao
@projectname: sanchuanglianxi
"""
# #装饰器函数其实就是一个接口约束，只要是一个callable对象都可以作为参数
# class Test():
#     def __call__(self):
#         print("call me")
# t = Test()
# t()

#基于类实现装饰器
#装饰器需要一个callable对象,并返回一个callable对象，用类去实现也是可以的。
#可以让类的构造函数接受一个函数，然后__call__函数处理并返回一个函数

#不带参数的装饰器，用类实现
import functools
class A:
    def __init__(self,func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print("this is A.__CALL__")
        return self.func(*args, **kwargs)

    # def cost(func):
    #         @functools.wraps(func)
    #         def _cost(*args,**kwargs):
    #             print("start.......")
    #             func(*args,**kwargs)
    #             print("end..........")
    #         return _cost
    # @cost
    # def fun2(self):
    #     print("i am func2")

@A
def func1():
    print("i am func1")
func1()

#带参数的装饰器,用类实现
# class A:
#     def __init__(self,name):
#         self.name = name
#
#     def __call__(self, func):
#         def deco(*args,**kwargs):
#             print("i am call")
#             print(self.name)
#             func(*args,**kwargs)
#         return deco
# @A("wenyao")
# def func1():
#     print("i am func1")
#
# func1()
